//基本数据类型结合闭包
// int x = cal(10)
// //是从1开始,到number,下面的方式一样的.因为upto是DefaultGroovyMethods的静态方法.1属于Integer类型,所以可以直接调用//DefaultGroovyMethods.upto
// int fab(int number){
//     int result = 1
//     1.upto(number, { num -> result *= num })    
//     return result
// }
// //grovvy中闭包可以不放在括号内,可以直接放在括号外.像下面这张写法


// int fab2(int number){
//     int result = 1
//     number.downto(1){ num -> result *= num} 
//     return result
// }
// //闭包写在括号外是groovy中很常见的方式.times方法的实现循环始终是从0开始的
// int cal(int number){
//     int result = 0 
//     number.times {
//         num -> result += num
//     }
//     return result
// }
// println x

/**闭包三个重要变量 this,owner,delegate**/
def scriptClouser = {
    println "scriptClouser  this"+ this //代表闭包定义出的类
    println "scriptClouser  owner"+ owner //代表闭包定义处的类或者变量
    println "scriptClouser  delegate"+ delegate //代表做任意对象，默认和owner一致

}

// scriptClouser.call()

class Person{
    
    def  classClouser ={
        println "classClouser  this"+ this //代表闭包定义出的类
        println "classClouser  owner"+ owner //代表闭包定义处的类或者变量
        println "classClouser  delegate"+ delegate //代表做任意对象，默认和owner一致
    }

    def  say(){
         def  classClouser ={
            println "methodClouser  this"+ this //代表闭包定义出的类
            println "methodClouser  owner"+ owner //代表闭包定义处的类或者变量
            println "methodClouser  delegate"+ delegate //代表做任意对象，默认和owner一致
        }
        classClouser.call()
    }
}
Person p = new Person()
// p.classClouser.call()
// p.say()

//闭包中定义一个闭包
def nestClouser = {
    def innerClouser = {
        println "innerClouser  this"+ this //代表闭包定义出的类
        println "innerClouser  owner"+ owner //代表闭包定义处的类或者变量
        println "innerClouser  delegate"+ delegate //代表做任意对象，默认和owner一致
    }
    innerClouser.delegate  = p; //修改默认的delegate对象
    innerClouser.call()
}

// nestClouser.call()


/**
* 闭包委托策略
*/

class Student {
    String name
    def pretty = { "My name is ${name}" }

    String toString() { pretty.call() }

}
class Teacher{
    String name
}
def stu=new Student(name:'Sarash')
def tea=new Teacher(name:'Qroovy')
stu.pretty.delegate=tea//修改委托
stu.pretty.resolveStrategy=Closure.DELEGATE_ONLY//更改委托策略方式
println stu.toString() 
